/* Soubor je ulozen v kodovani UTF-8.
 * Kontrola kódování: Příliš žluťoučký kůň úpěl ďábelské ódy. */

package cz.vse.adventura.po1715.cerj117_cermak.hra;

import cz.pecinovsky.english.pojj.adv_framework.game_gui.Commands;
import cz.pecinovsky.english.pojj.adv_framework.game_gui.IBagG;
import cz.pecinovsky.english.pojj.adv_framework.game_gui.IGameG;
import cz.pecinovsky.english.pojj.adv_framework.game_gui.IListener;
import cz.pecinovsky.english.pojj.adv_framework.game_gui.IPlaceG;
import cz.vse.adventura.po1715.cerj117_cermak.SprávceScénářůL;
//import cz.pecinovsky.english.pojj.adv_framework.game_txt.IBag;
//import cz.pecinovsky.english.pojj.adv_framework.game_txt.IPlace;
import cz.pecinovsky.english.pojj.adv_framework.game_txt.ICommand;
import cz.pecinovsky.english.pojj.adv_framework.scenario.AScenarioManager;
// import cz.pecinovsky.česky.pojj.adventura.test_util.TestHry;
import java.net.URL;

import java.util.Collection;
import javax.swing.ImageIcon;





/*******************************************************************************
 * Instance třídy {@code MojeHra} představuje hru, ve které jde o to dostat se
 * nádraží....ale předtím vykonat svoji základní potřebu - záchod.
 *
 * @author    Jiří Čermák
 * @version   1.00.000
 */
public class MojeHra implements IGameG
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    /** Aktuálně provozovaná hra. Je-li tento odkaz prázdný, není aktuálně
     *  provozována žádná hra a může se spustit nová. */
    private static MojeHra aktuálníHra = new MojeHra();

//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    private final AScenarioManager správceScénářů = SprávceScénářůL.getInstance();

//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     *
     */
    private MojeHra()
    {
        MojeHra já = this;
        správceScénářů.setGame(já);

      //  správceScénářů.setGame(this);
    }

     /***************************************************************************
     * Vrátí odkaz na aktuálně provozovanou instanci hry.
     * Metoda slouží k tomu, aby mohli někžteré metody získat odkaz
     * na aktuální hru a od ní pak získat jinak nedostupné informace.
     *
     * @return Požadovaný odkaz
     */
    public static MojeHra getHra()
    {
        return aktuálníHra;
    }


//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================

     /***************************************************************************
     * Vrátí jméno autora scénáře ve formátu "PŘÍJMENÍ Křestní",
     * tj. neprve příjmení psané velkými písmeny a za ním křestní jméno,
     * u nějž bude velké pouze první písmeno a ostatní písmena budou malá.
     *
     * @return Jméno autora/autorky programu ve tvaru PŘÍJMENÍ Křestní
     */
    @Override
    public String getAuthor()
    {
        return správceScénářů.getAuthor();
    }


    /***************************************************************************
     * Vrátí x-name autora/autorky programu zapsané velkými písmeny.<p>
     * X-name má tvar <b>{@code XPPPK99}</b> nebo <b>{@code XPPPK999}</b>,
     * kde<br>
     * <ul>
     *   <li><b>{@code PPP}</b> zastupuje první tří písmena příjmení autora(ky)
     *      zapsaná velkými písmeny, </li>
     *   <li><b>{@code K}</b> zastupuje první písmeno křestního jména a </li>
     *   <li><b>{@code 99}</b>, resp. <b>{@code 999}</b> zastupují číslice
     *      přiřazené systémem, pomocí nichž se rozsliší studenti(ky)
     *      s předchozími znaky shodnými.
     * </ul>
     *
     * @return X-name autora/autorky programu
     */
    @Override
    public String getXNAME()
    {
         return správceScénářů.getXNAME();
    }


      /***************************************************************************
     * Vrátí odkaz na aktuální místnost,
     * tj. na místnost, v niž se pravé nachází hráč.
     *
     * @return Požadovaný odkaz
     */
    @Override
    public Místnosti getActualPlace()
    {
        return Místnosti.getAktuálníMístnost();
    }


    /***************************************************************************
     * Vrátí odkaz na batoh, do nějž bude hráč ukládat sebrané předměty.
     *
     * @return Požadovaný odkaz
     */
    @Override
    public Batoh getBag()
    {
        return Batoh.getBatoh();
    }


    /***************************************************************************
     * Vrátí kolekci odkazů na jednotlivé místnosti.
     *
     * @return Požadovaná kolekce
     */
    @Override
    public Collection<Místnosti> getAllPlaces()
    {
        return Místnosti.getMístnosti();
    }


    /***************************************************************************
     * Vrátí kolekci všech příkazů použitelných ve hře.
     *
     * @return Požadovaná kolekce
     */
    @Override
    public Collection<ICommand> getAllCommands()
    {
        return Příkaz.getPříkazy();
    }


    /***************************************************************************
     * Vrátí informaci o tom, je-li hra již ukončena.
     *
     * @return Požadovaná informace
     */
    @Override
    public boolean isReady()
    {
        return Příkaz.isSkončeno();
    }


    /***************************************************************************
     * Vrátí správce scénářů, které umožní prověřit funkčnost hry
     * a/nebo demonstrovat její průběh.
     *
     * @return Správce scénářů dané hry
     */
    @Override
    public AScenarioManager getScenarioManager()
    {
        return správceScénářů;
    }


    /***************************************************************************
     * Ukončí celou hru a vrátí alokované prostředky.
     */
    @Override
    public void stop()
    {
        Příkaz.konec();
    }


    /***************************************************************************
     * Zpracuje zadaný příkaz a vrátí text zprávy pro uživatele.
     *
     * @param prikaz Zadávaný příkaz
     * @return Textová odpověď hry na zadaný příkaz
     */
    @Override
    public String executeCommand( String prikaz )
    {
        return Příkaz.zpracujPříkaz(prikaz);
    }

    public URL getHelpURL() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public ImageIcon getMap() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public Commands getBasicCommands() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void addBagListener(IListener<IBagG> listener) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void removeBagListener(IListener<IBagG> listener) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void addObjectListener(IListener<IPlaceG> listener) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void removeObjectListener(IListener<IPlaceG> listener) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void addNeighborsListener(IListener<IPlaceG> listener) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void removeNeighborsListener(IListener<IPlaceG> listener) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void addDialogListener(IListener<Boolean> listener) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void removeDialogListener(IListener<Boolean> listener) {
        throw new UnsupportedOperationException("Not supported yet.");
    }


    
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTOVACÍ METODY A TŘÍDY ==================================================
 /***************************************************************************
      * Testovací metoda.
      */
//     public static void test()
//     {
//        MojeHra hra = getGame();
////        SpouštěníScénářů.proveďScénáře(hra);
//        TestHry test = new TestHry(hra);
//        test.proveďRozšířený();
//     }
//     /** @param args Parametry příkazového řádku - nepoužité. */
//     public static void main( String... args ) { test(); }


}